home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 November
/
EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso
/
earcd
/
program
/
misc
/
octamed-.lha
/
Programmers
/
reloc.a
< prev
Wrap
Text File
|
1995-03-26
|
4KB
|
169 lines
; A small reloc routine for those who include the module directly in
; the program code.
; NOTE: The module pointer is passed in register A0. Use stubs with
; C.
SECTION "text",code
XDEF _RelocModule
mmd_songinfo EQU 8
mmd_blockarr EQU 16
mmd_expdata EQU 32
mmd_songsleft EQU 51
msng_numblocks EQU 504
msng_pseqs EQU 508
msng_numsamples EQU 787
reloci move.l 24(a2),d0
beq.s xloci
movea.l d0,a0
moveq #0,d0
move.b msng_numsamples(a1),d0 ;number of samples
subq.b #1,d0
relocs bsr.s relocentr
move.l -4(a0),d3 ;sample ptr
beq.s nosyn
move.l d3,a3
tst.w 4(a3)
bpl.s nosyn ;type >= 0
move.w 20(a3),d2 ;number of waveforms
lea 278(a3),a3 ;ptr to wf ptrs
subq.w #1,d2
relsyn add.l d3,(a3)+
dbf d2,relsyn
nosyn dbf d0,relocs
xloci rts
norel addq.l #4,a0
rts
relocentr tst.l (a0)
beq.s norel
add.l d1,(a0)+
rts
_RelocModule:
movem.l a2-a4/d2-d4,-(sp)
movea.l a0,a2
move.l a2,d1 ;d1 = ptr to start of module
bsr.s relocp
movea.l mmd_songinfo(a2),a1
bsr.s reloci
move.b mmd_songsleft(a2),d4
rel_lp bsr.s relocb
cmp.b #'2',3(a2) ;MMD2?
bne.s norelmmd2
bsr.w relocmmd2sng
norelmmd2 move.l mmd_expdata(a2),d0 ;extension struct
beq.s rel_ex
move.l d0,a0
bsr.s relocentr ;ptr to next module
bsr.s relocentr ;InstrExt...
addq.l #4,a0 ;skip sizes of InstrExt
; We reloc the pointers of MMD0exp, so anybody who needs them can easily
; read them.
bsr.s relocentr ;annotxt
addq.l #4,a0 ;annolen
bsr.s relocentr ;InstrInfo
addq.l #8,a0
bsr.s relocentr ;rgbtable (not useful for most people)
addq.l #4,a0 ;skip channelsplit
bsr.s relocentr ;NotationInfo
bsr.s relocentr ;songname
addq.l #4,a0 ;skip song name length
bsr.s relocentr ;MIDI dumps
bsr.s relocmdd
subq.b #1,d4 ;songs left..?
bcs.s rel_ex
move.l d0,a0
move.l (a0),d0
beq.s rel_ex
move.l d0,a2
bsr.s relocp
movea.l 8(a2),a1
bra.s rel_lp
rel_ex movem.l (sp)+,d2-d4/a2-a4
rts
relocp lea mmd_songinfo(a2),a0
bsr.s relocentr
addq.l #4,a0
bsr.s relocentr
addq.l #4,a0
bsr.s relocentr
addq.l #4,a0
bra.s relocentr
relocb move.l mmd_blockarr(a2),d0
beq.s xlocb
movea.l d0,a0
move.w msng_numblocks(a1),d0
subq.b #1,d0
rebl bsr relocentr
dbf d0,rebl
cmp.b #'T',3(a2) ;MMD0 (= MCNT)
beq.s xlocb
cmp.b #'1',3(a2) ;test MMD type
bge.s relocbi
xlocb rts
relocmdd move.l d0,-(sp)
tst.l -(a0)
beq.s xlocmdd
movea.l (a0),a0
move.w (a0),d0 ;# of msg dumps
addq.l #8,a0
mddloop beq.s xlocmdd
bsr relocentr
bsr.s relocdmp
subq.w #1,d0
bra.s mddloop
xlocmdd move.l (sp)+,d0
rts
relocdmp move.l -4(a0),d3
beq.s xlocdmp
exg.l a0,d3 ;save
addq.l #4,a0
bsr relocentr ;reloc data pointer
move.l d3,a0 ;restore
xlocdmp rts
relocbi move.w msng_numblocks(a1),d0
move.l a0,a3
biloop subq.w #1,d0
bmi.s xlocdmp
move.l -(a3),a0
addq.l #4,a0
bsr relocentr ;BlockInfo ptr
tst.l -(a0)
beq.s biloop
move.l (a0),a0
bsr relocentr ;hldata
bsr relocentr ;block name
addq.l #4,a0 ;skip blocknamelen
bsr relocentr ;pagetable
tst.l -(a0)
bne.s relocpgtbl
bra.s biloop
; take care of the new features of MMD2s
relocmmd2sng move.l mmd_songinfo(a2),a0
lea msng_pseqs(a0),a0
bsr relocentr ;playseqtable
bsr relocentr ;sectiontable
bsr relocentr ;trackvols
move.w 2(a0),d0 ;numpseqs
move.l -12(a0),a0 ;get back to playseqtable
subq.w #1,d0
psqtblloop bsr relocentr
dbf d0,psqtblloop
rts
relocpgtbl movea.l (a0),a4 ;page table list hdr
move.w (a4),d2
subq.w #1,d2
lea 4(a4),a0
pgtblloop bsr relocentr
dbf d2,pgtblloop
bra biloop
END